package multithreading;

import java.util.concurrent.*;

/**
 * Future类
 *
 * boolean cancel(boolean mayInterruptRunning)  取消这个任务
 * boolean isCancelled()                        判断任务是不是已经取消了
 * boolean isDone()                             判断任务是不是已经完成了
 * V get()                                      无限等待任务完成
 * V get(long timeout, TimeUnit unit)           在限定的等待时间timeout内等待任务完成，unit为时间单位
 * */
public class FutureDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 异步操作可以用一个线程池
        ExecutorService executor = Executors.newFixedThreadPool(3);
        // 执行FutureTask，相当于上例中的 client.request("name") 发送请求
        // 在这里开启线程进行RealData的call()执行
        String request1 = "获取音乐资源", request2 = "获取电影资源", request3 = "获取学习资料";
        Future<String> future1 = executor.submit(new Service(request1));
        Future<String> future2 = executor.submit(new Service(request2));
        Future<String> future3 = executor.submit(new Service(request3));
        System.out.println("请求完毕，处理其他事");
        try {
            // 这里依然可以做额外的数据操作，这里使用sleep代替其他业务逻辑的处理
            Thread.sleep(3000);
            System.out.println("已处理完其他事");
        } catch (InterruptedException e) {
        }
        if (!future2.isDone()) {
            future2.cancel(true);
            System.out.println(request2 + "请求未完成，已取消该请求");
        }
        if (!future2.isCancelled()) {
            System.out.println(request2 + "请求已被取消");
        }
        boolean flag = false;
        try {
            System.out.println("请求结果：" + future1.get(1, TimeUnit.SECONDS));
        } catch (TimeoutException e) {
            System.out.println(request1 + "请求未完成");
            flag = true;
        }
        // 如果此时call()方法没有执行完成，则依然会等待
        System.out.println("请求结果：" + future3.get());
        if (flag)
            System.out.println("请求结果：" + future1.get());
        executor.shutdown();
    }
}

class Service implements Callable<String> {
    private final String msg;

    public Service(String msg) {
        this.msg = msg;
    }

    @Override
    public String call() throws Exception {
        System.out.println("接收到请求：" + msg);
        System.out.println("正在处理请求...");
        Thread.sleep(10000);
        System.out.println(msg + "请求已被处理");
        return msg.substring(2) + "已准备好，请查收";
    }
}